// PROGRAMA : TABPA002 OPCAO: 'ATS'
// BIBLIOTECA : PRODETR
// SISTEMA : INFORMACOES DE SEGURANCA PUBLICA - SISP
// CLIENTE : SEJUSP - SEC. DA JUSTICA E SEGURANCA PUBLICA
// INSTITUTO DE IDENTIFICACAO
// PROGRAMADOR : EDU/FM DATA: 27/05/92
// OBJETIVO : ATUALIZAR TABELA DE SENHA(ROTINA: TABSATU)
// ATUALIZACOES DATA
// PROGRAMA : TABPA002 21/06/1999
// BIBLIOTECA : PRODETR
// PROGRAMADOR :
// OBJETIVO : ADAPTACAO PARA O SHOPPING DO CIDADAO (P200)
// ALTERACAO DA TELA E DATAS N6 PARA N8 EM 13/10/1999
// ACERTO DO ERRO 3052 EM 23/11/1999
// OBS : ESTE PROGRAMA FOI REESTRUTURADO POR SOLON MIRANDA
package br.com.vti.sisp_sicrim.antigo.controller.programa;

import java.text.SimpleDateFormat;
import java.util.Calendar;

import org.apache.commons.lang3.StringUtils;

import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.vti.sisp_sicrim.antigo.controller.tela.Sistha01;
import br.com.vti.sisp_sicrim.antigo.controller.tela.Sistha02;
import br.com.vti.sisp_sicrim.antigo.controller.tela.Tabpa002A;
import br.com.vti.sisp_sicrim.antigo.controller.tela.Tabta002;
import br.com.vti.sisp_sicrim.antigo.model.SicHisTabelas;
import br.com.vti.sisp_sicrim.antigo.model.SicTabelas;
import br.com.vti.sisp_sicrim.antigo.model.Sislac01;
import br.com.vti.sisp_sicrim.antigo.util.ExceptionProgram;
import br.com.vti.sisp_sicrim.antigo.util.Sessao;
import br.com.vti.sisp_sicrim.antigo.util.Sisgsisp;
import br.com.vti.sisp_sicrim.antigo.util.UtilBean;

/**
 * Classe : Tabpa002 OBJETIVO : ATUALIZAR TABELA DE SENHA(ROTINA: TABSATU) *
 * 
 * @author Incode - Data: mai/2014
 * 
 */
@Resource
@Path("/antigo/tabpa002")
public class Tabpa002 {
	// Views utilizadas
	SicTabelas vwDvetab = new SicTabelas();
	SicHisTabelas vwHistab = new SicHisTabelas();
	SicTabelas vwTabele = new SicTabelas();
	// Telas/relatorios utilizados
	Sistha01 sistha01;
	Sistha02 sistha02;
	Tabpa002A tabpa002A;
	Tabta002 tabta002;
	// Includes utilizados
	Sislac01 sislac01 = new Sislac01();
	// Areas globais / session
	Sisgsisp sisgsisp;
	// Funcoes/subrotinas
	FuncoesGerais funcoes = new FuncoesGerais();

	Result result;
	Sessao sessao;
	Boolean primeiraVez = false;
	Tabpa002 tabpa002Anterior;
	String faseproc = "0";

	private String isn = "";
	private int sete = 0;
	private int seis = 0;
	private int zero = 0;
	private int oito = 0;
	private int treis = 0;
	private String acess = "";
	private String nive = "";
	private String[][] mod0 = new String[4][17];
	private String[] cpo0 = { "", "000", "100", "010", "110", "001", "101", "011", "111" };
	private String cpo2 = "";
	private String desc = "";
	private int datatu = 0;

	private Tabpa002A preMapas() {
		int i1, i2;
		sistha01 = new Sistha01(true, sessao);
		sistha02 = new Sistha02(true, sessao);
		tabpa002A = new Tabpa002A(true, sessao);
		tabta002 = new Tabta002(true, sessao);
		for (i1 = 1; i1 <= 3; i1++) {
			for (i2 = 1; i2 <= 8; i2++) {
				tabta002.setMod1(i1, i2, "0");
				tabta002.setMod2(i1, i2, "0");
			}
		}
		for (i1 = 1; i1 <= 3; i1++) {
			for (i2 = 1; i2 <= 16; i2++) {
				mod0[i1][i2] = "";
			}
		}
		tabta002.setDataCorrente(UtilBean.obtemDataCorrente());
		tabta002.setDataCorrente(UtilBean.inverteDataCorrente());
		// DATE := MAP-DATN

		datatu = tabta002.getDataCorrente();
		// VE BY NAME DATE1 TO DATAT1
		sessao.getSisgsisp().setVar(11);
		// Par�grafo: r0()
		return tabpa002A;
	}

	public Tabpa002(Result result, Sessao sessao) {
		this.result = result;
		this.sessao = sessao;
	}

	@Post
	public void executar(Sistha01 sistha01, Sistha02 sistha02, Tabpa002A tabpa002A, Tabta002 tabta002) {
		try {
			main(sistha01, sistha02, tabpa002A, tabta002);
		} catch (Exception e) {
			ExceptionProgram excp = new ExceptionProgram();
			excp.trataErroSiscerro(e, sessao, this.getClass().getSimpleName());
		}
	}

	private void main(Sistha01 psistha01, Sistha02 psistha02, Tabpa002A ptabpa002A, Tabta002 ptabta002) throws Exception {
		if (psistha01 == null && psistha02 == null && ptabpa002A == null && ptabta002 == null) {
			primeiraVez = true;
			// tabta002 = new Tabta002 (primeiraVez);
			tabpa002A = preMapas();
			tabpa002A.setNavegar("../tabpa002/executar");
			result.include("tabpa002A", tabpa002A);
			sessao.setAtributo("TABPA002", this);
			tabpa002A.enviarTela(primeiraVez, result, getClass().getSimpleName().toUpperCase());
			return;
		} else {
			restaurarEstados(psistha01, psistha02, ptabpa002A, ptabta002);
		}
		// Repeat
		if (faseproc.equals("0")) {
			tabpa002A.receberTela(false, result);
			if (!UtilBean.funcao.equals(UtilBean.ctt_processa)) {
				tabpa002A.enviarMensagem(null, "");
				sessao.setAtributo("TABPA002", this);
				result.include("tabpa002A", tabpa002A);
				tabpa002A.enviarTela(primeiraVez, result, getClass().getSimpleName().toUpperCase());
				return;
			}
			if (!tabpa002A.getOperacao().equals("ATS")) {
				funcoes.sissm001(result, sessao);
			}
			if (tabpa002A.getMatfun() == 0) {
				tabpa002A.enviarMensagem("operacao", "");
				sessao.setAtributo("TABPA002", this);
				result.include("tabpa002A", tabpa002A);
				tabpa002A.enviarTela(primeiraVez, result, getClass().getSimpleName().toUpperCase());
				return;
			}
			if (tabatu() == false) {

				sessao.setAtributo("TABPA002", this);
				result.include("tabpa002A", tabpa002A);
				tabpa002A.enviarTela(primeiraVez, result, getClass().getSimpleName().toUpperCase());
				return;
			}
			vwDvetab.pesq = UtilBean.moveSubstring(vwDvetab.pesq, 0, 3, "N", 18);
			vwDvetab.pesq = UtilBean.moveSubstring(vwDvetab.pesq, 3, 12, "N", tabpa002A.getMatfun());
			if (vwDvetab.pesquisaTabele(18, (long) tabpa002A.getMatfun())) {
				tabta002.setMensagem("REGISTRO CADASTRADO - TECLE ENTER PARA ATUALIZAR");

				tabta002.setVwdvetabdintabdatatu(vwDvetab.getDataAtualizacao());
				desc = vwDvetab.getDescricaoElem();

				String desc1 = StringUtils.substring(vwDvetab.getDescricaoElem(), 0, 30);
				tabta002.setNomfun(desc1);

				tabta002.setMatatu(vwDvetab.getMatriculaFunc());
				tabta002.setSenfun(vwDvetab.getChaveAlfaAcesso());
				tabta002.setSenhaa(vwDvetab.getChaveAlfaAcesso());
				seis = 0;
				isn = vwDvetab.getId(); // *ISN(1150);
				tabta002.setGrupel(Integer.valueOf(vwDvetab.getGrupoElem().trim().equals("") || !StringUtils.isNumeric(vwDvetab.getGrupoElem()) ? "0" : "0" + vwDvetab.getGrupoElem()));

				nive = UtilBean.subStr(desc, 30, 1);// (1) ;

				tabta002.setMatatu(vwDvetab.getMatriculaFunc());
				tabta002.setMatfun(Integer.valueOf("0" + vwDvetab.getCodigoElem()));
				tabta002.setGrupel(Integer.valueOf("0" + vwDvetab.getGrupoElem()));
				;

				// MOVE DIATAB-CHALFA TO SENHA-A
				switch (nive) {
				case "I": {
					tabta002.setSitua("INCLUIDO");
					break;
				}
				case "A": {
					tabta002.setSitua("ALTERADO");
					break;
				}
				case "E": {
					tabta002.setSitua("DELETADO");
					break;
				}
				default: {
					break;
				}
				}
				for (sete = 1; sete <= 16; sete++) {
					zero = sete + 1;

					nive = UtilBean.subStr(desc, 30 + zero - 1, 1);
					nive = UtilBean.moveSubstring(nive, 0, 1, "N", String.valueOf(Integer.parseInt(UtilBean.subStr(nive.trim().equals("") ? "0" : nive, 0, 1)) + 1));

					cpo2 = cpo0[Integer.parseInt(UtilBean.subStr(nive.trim().equals("") ? "0" : nive, 0, 1))];
					for (treis = 1; treis <= 3; treis++) {
						if (sete < 9) {
							tabta002.setMod1(treis, sete, UtilBean.subStr(cpo2, 0 + treis - 1, 1));
							mod0[treis][sete] = tabta002.getMod1(treis, sete);
						} else {
							seis = sete - 8;

							tabta002.setMod2(treis, seis, UtilBean.subStr(cpo2, 0 + treis - 1, 1));
							mod0[treis][sete] = tabta002.getMod2(treis, seis);
						}
					}
				}
				if (!testaNiveis()) {
					result.include("tabpa002A", tabpa002A);
					sessao.setAtributo("TABPA002", this);
					tabpa002A.enviarTela(primeiraVez, result, getClass().getSimpleName().toUpperCase());
					return;
				}

				faseproc = "1";
				sessao.setAtributo("TABPA002", this);
				result.include("tabta002", tabta002);
				if (!result.used())
					tabta002.enviarTela(false, result, getClass().getSimpleName().toUpperCase());
				return;
			} else {
				tabta002.setMensagem("REGISTRO INEXISTENTE - TECLE ENTER PARA INCLUIR");
				tabta002.setVwdvetabdintabdatatu(UtilBean.obtemDataCorrente());

				tabta002.setMatfun(tabpa002A.getMatfun());

				tabta002.setMatatu(tabpa002A.getMatric());

				faseproc = "3";
				sessao.setAtributo("TABPA002", this);
				result.include("tabta002", tabta002);
				tabta002.enviarTela(false, result, getClass().getSimpleName().toUpperCase());
				return;
			}
		}
		if (faseproc.equals("1")) {
			tabta002.receberTela(false, result);
			// TELA ATUALIZACAO TABELA DE SENHA
			if (!tabta002.getOperacao().equals("ATS")) {
				funcoes.sissm001(result, sessao);
			}
			/*
			 * if (!UtilBean.funcao.equals(UtilBean.ctt_confirma)) { tabta002.enviarMensagem(null, "TECLE PF5 PARA ATUALIZAR"); sessao.setAtributo("TABPA002", this); result.include("tabta002",
			 * tabta002); tabta002.enviarTela(false, result, getClass().getSimpleName().toUpperCase()); return; }
			 */
			String desc1 = tabta002.getNomfun();
			desc = StringUtils.rightPad(desc1, 30, " ");

			String niveis = montaNiveis();
			desc = desc + niveis;
			faseproc = "2";
			sessao.setAtributo("TABPA002", this);
			result.include("sistha01", sistha01);
			sistha01.enviarTela(false, result, getClass().getSimpleName().toUpperCase());
			return;
		}
		if (faseproc.equals("2")) {
			sistha01.receberTela(false, result);
			// ALTERACAO OU BAIXA
			if (UtilBean.funcao.equals(UtilBean.ctt_retorna)) {
				tabpa002A.setMensagemSaida("ALTERACAO NAO FOI EXECUTADA");
				sessao.setAtributo("TABPA002", this);
				result.include("tabpa002A", tabpa002A);
				tabta002.enviarTela(primeiraVez, result, getClass().getSimpleName().toUpperCase());
				return;
			}

			testaNiveis();
			tabatu();
			historico();
			if (!sistha01.getOp3().trim().equals("")) {
				vwDvetab.pesquisaPorId();

				String desc1 = tabta002.getNomfun();
				desc = StringUtils.rightPad(desc1, 30, " ");

				String niveis = montaNiveis();
				desc = desc + niveis;

				desc = UtilBean.moveSubstring(desc, 30, 1, "A", "E");

				vwDvetab.setCodigoElem((long) tabta002.getMatfun());
				vwDvetab.setDescricaoElem(desc);
				vwDvetab.setChaveAlfaAcesso(new SimpleDateFormat("HH:mm:ss").format(Calendar.getInstance().getTime()));
				vwDvetab.setMatriculaFunc(sessao.getSisgsisp().getMatric());
				vwDvetab.setDataAtualizacao(UtilBean.obtemDataCorrente());
				vwDvetab.setGrupoElem(tabta002.getGrupel() + "");
				vwDvetab.atualiza();
				// dao.commit()
				preMapas();
				faseproc = "0";
				tabpa002A.setMensagemSaida(" REGISTRO DELETADO OK.");
			}
			if (!sistha01.getOp2().trim().equals("")) {

				vwDvetab.pesquisaPorId();
				desc = UtilBean.moveSubstring(desc, 30 + 1 - 1, 1, "A", "A");

				vwDvetab.setDescricaoElem(desc);
				if (!tabta002.getSenfun().trim().equals("")) {

					vwDvetab.setChaveAlfaAcesso(tabta002.getSenfun());
				}

				vwDvetab.setGrupoElem(tabta002.getGrupel() + "");
				vwDvetab.setDataApoio(UtilBean.obtemDataCorrente());
				vwDvetab.setDataAtualizacao(UtilBean.obtemDataCorrente());
				vwDvetab.setMatriculaFunc(sessao.getSisgsisp().getMatric());
				vwDvetab.setCodigoElem((long) tabta002.getMatfun());
				vwDvetab.setGrupoElem(tabta002.getGrupel() + "");
				vwDvetab.atualiza();
				// dao.commit();
				preMapas();
				faseproc = "0";
				tabpa002A.setMensagemSaida("REGISTRO ALTERADO OK.");

			}
		}
		if (faseproc.equals("3")) {
			tabta002.receberTela(false, result);
			// TELA ATUALIZACAO TABELA DE SENHA
			if (tabta002.getSenfun().trim().equals("")) {
				tabta002.enviarMensagem("senfun", "INFORME A SENHA DO FUNCIONARIO");
				return;
			}
			if (!tabta002.getOperacao().equals("ATS")) {
				funcoes.sissm001(result, sessao);
			}
			/*
			 * if (!UtilBean.funcao.equals(UtilBean.ctt_confirma)) { tabta002.enviarMensagem(null, "TECLE ENTER PARA ATUALIZAR"); return; }
			 */
			faseproc = "4";
			sessao.setAtributo("TABPA002", this);
			result.include("sistha02", sistha02);
			sistha02.enviarTela(false, result, getClass().getSimpleName().toUpperCase());
			return;
		}

		if (faseproc.equals("4")) {
			sistha02.receberTela(false, result);
			// TELA CONFIRMA OPERACAO
			if (UtilBean.funcao.equals(UtilBean.ctt_retorna)) {
				tabpa002A.setMensagemSaida("INCLUSAO NAO FOI EXECUTADA");
				sessao.setAtributo("TABPA002", this);
				result.include("tabpa002A", tabpa002A);
				tabta002.enviarTela(primeiraVez, result, getClass().getSimpleName().toUpperCase());
				return;
			}

			String desc1 = tabta002.getNomfun();
			desc = StringUtils.rightPad(desc1, 30, " ");

			String niveis = montaNiveis();
			desc = desc + niveis;

			testaNiveis();
			tabatu();

			desc = UtilBean.moveSubstring(desc, 30, 1, "A", "I");

			vwDvetab.setDescricaoElem(desc);
			vwDvetab.setChaveAlfaAcesso(tabta002.getSenfun());
			vwDvetab.setDataApoio(UtilBean.obtemDataCorrente());
			vwDvetab.setGrupoElem(tabta002.getGrupel() + "");
			vwDvetab.setDataAtualizacao(UtilBean.obtemDataCorrente());
			vwDvetab.setMatriculaFunc(sessao.getSisgsisp().getMatric());
			vwDvetab.setCodigoTabela(18);
			vwDvetab.setCodigoElem((long) tabta002.getMatfun());
			vwDvetab.grava();
			// dao.commit();
			preMapas();
			faseproc = "0";
			tabpa002A.setMensagemSaida("REGISTRO INCLUIDO OK.");
		}
		sessao.setAtributo("TABPA002", this);
		result.include("tabpa002A", tabpa002A);
		tabpa002A.enviarTela(primeiraVez, result, getClass().getSimpleName().toUpperCase());
	}

	private String montaNiveis() {
		String nivelGeral = "A";
		for (sete = 1; sete <= 16; sete++) {
			zero = sete + 1;

			// nive = UtilBean.subStr(desc, 30 + zero - 1, 1);

			// cpo2 = cpo0[Integer.parseInt(UtilBean.subStr(nive.trim().equals("") ? "0" : nive, 0, 1))];
			String nivel = "";
			for (treis = 1; treis <= 3; treis++) {
				if (sete < 9) {
					nivel = nivel + tabta002.getMod1(treis, sete);

				} else {
					seis = sete - 8;

					nivel = nivel + tabta002.getMod2(treis, seis);
				}

			}
			for (int i = 1; i <= cpo0.length; i++) {

				if (nivel.trim().equals(cpo0[i])) {
					nivelGeral = nivelGeral + (i - 1);
					break;
				}
			}

		}
		return nivelGeral;
	}

	private void historico() {
		vwHistab.setCodigoTabela(18);
		vwHistab.setDescel(vwDvetab.getDescricaoElem());
		vwHistab.setChalfa(vwDvetab.getChaveAlfaAcesso());
		vwHistab.setDataPo(vwDvetab.getDataAtualizacao());
		vwHistab.setGrupel(vwDvetab.getGrupoElem());
		vwHistab.setDataAtualizacao(UtilBean.obtemDataCorrente());
		vwHistab.setMatriculaFunc(vwDvetab.getMatriculaFunc());
		vwHistab.setCodElemento(vwDvetab.getCodigoElem());
		vwHistab.grava();
		// dao.commit();
	}

	private boolean testaNiveis() throws Exception {
		for (sete = 1; sete <= 16; sete++) {
			for (treis = 1; treis <= 3; treis++) {
				if (sete < 9) {
					if (!UtilBean.validarMascara(tabta002.getMod1(treis, seis) == null ? "0" : tabta002.getMod1(treis, seis), "0-1")) {
						sistha02.enviarMensagem(null, "");
						return false;
					}
					cpo2 = UtilBean.moveSubstring(cpo2, 0 + treis - 1, 1, "A", tabta002.getMod1(treis, sete));
				} else {
					seis = sete - 8;
					if (!UtilBean.validarMascara(tabta002.getMod2(treis, seis), "0-1")) {
						sistha02.enviarMensagem(null, "");
						return false;
					}
					cpo2 = UtilBean.moveSubstring(cpo2, 0 + treis - 1, 1, "A", tabta002.getMod2(treis, seis));
				}
			}
			for (oito = 1; oito <= 8; oito++) {
				if (cpo0[oito] != null && cpo0[oito].trim().equals(cpo2)) {
					break;
				}
			}
			zero = sete + 1;
			oito = oito - 1;

			acess = UtilBean.subStr(sislac01.niveis, 30 + zero - 1, 1);
			if (sistha02.getMatric() != 34165) {
				if (!((Integer.parseInt(UtilBean.subStr(acess.trim().equals("") ? "0" : acess, 0, 1)) == oito || Integer.parseInt(UtilBean.subStr(acess.trim().equals("") ? "0" : acess, 0, 1)) == 3 || Integer.parseInt(UtilBean.subStr(acess.trim().equals("") ? "0" : acess, 0, 1)) == 7)) && oito != 0) {
					// sistha02.enviarMensagem(null, "");
					// return false;
				}
			}
			desc = UtilBean.moveSubstring(desc, 30 + zero - 1, 1, "A", oito);
		}
		return true;
	}

	private boolean tabatu() {
		vwTabele.pesq = UtilBean.moveSubstring(vwTabele.pesq, 0, 3, "N", 18);
		vwTabele.pesq = UtilBean.moveSubstring(vwTabele.pesq, 3, 12, "N", tabpa002A.getMatric());
		// Par�grafo: t1()
		vwTabele.consultaTabele(18, (long) tabpa002A.getMatric());
		if (!vwTabele.getChaveAlfaAcesso().trim().equals(tabpa002A.getSenha().trim())) {
			tabpa002A.enviarMensagem("senha", "senha");
			return false;
		}
		sislac01.niveis = vwTabele.getDescricaoElem();
		if (!(UtilBean.subStr(sislac01.niveis, 30 + sessao.getSisgsisp().getVar() - 1, 1).equals("1") || UtilBean.subStr(sislac01.niveis, 30 + sessao.getSisgsisp().getVar() - 1, 1).equals("3") || UtilBean.subStr(sislac01.niveis, 30 + sessao.getSisgsisp().getVar() - 1, 1).equals("5") || UtilBean.subStr(sislac01.niveis, 30 + sessao.getSisgsisp().getVar() - 1, 1).equals("7"))) {
			tabpa002A.enviarMensagem("senha", "senha");
			return false;
		}

		if (vwTabele.registrosProcessados() == 0) {
			tabpa002A.enviarMensagem("matric", "");
			return false;
		}
		return true;
	}

	// SISCERRO}}} //UtilBean.mensagemTexto("!  ERROR NUMERO:" *ERROR-NR
	// "    LINHA:" *ERROR-LINE " PROGRAMA:" tabpa002A.getNomeClasse()
	// tabta002.getNomeClasse() "!");

	private void restaurarEstados(Sistha01 psistha01, Sistha02 psistha02, Tabpa002A ptabpa002A, Tabta002 ptabta002) {
		this.tabpa002Anterior = (Tabpa002) sessao.getAtributo("TABPA002");
		if (psistha01 != null) {
			sistha01 = psistha01;
		} else {
			sistha01 = this.tabpa002Anterior.sistha01;
		}
		sistha01.setSessao(sessao);
		if (psistha02 != null) {
			sistha02 = psistha02;
		} else {
			sistha02 = this.tabpa002Anterior.sistha02;
		}
		sistha02.setSessao(sessao);
		if (ptabpa002A != null) {
			tabpa002A = ptabpa002A;
		} else {
			tabpa002A = this.tabpa002Anterior.tabpa002A;
		}
		tabpa002A.setSessao(sessao);
		if (ptabta002 != null) {
			tabta002 = ptabta002;
		} else {
			tabta002 = this.tabpa002Anterior.tabta002;
		}
		tabta002.setSessao(sessao);
		this.faseproc = this.tabpa002Anterior.faseproc;
		vwDvetab = tabpa002Anterior.vwDvetab;
		desc = tabpa002Anterior.desc;
		nive = tabpa002Anterior.nive;
	}
}
